package com.holystone.orca.util;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import org.apache.commons.io.IOUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.log4j.Logger;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.SocketException;
import java.util.Properties;

/**
 * class name:FTPFileTransmit <BR>
 * class description: please write your description <BR>
 * Remark: <BR>
 * 
 * @version 1.00 2011-8-9
 */
public class FtpFileUtil {

	private final static Logger logger = Logger.getLogger(FtpFileUtil.class);
	/**
	 * FTP文件传输，将本地文件传到指定ip的知道目录
	 * 
	 * @author huangjc
	 * @param ftpServerIp
	 *            目标机Ip
	 * @param account
	 *            目标机登录名
	 * @param password
	 *            目标机登陆密码
	 * @param filePath
	 *            本地文件路径
	 * @param FileName
	 *            上传文件名
	 * @param uploadFilePath
	 *            文件上传的目标机路径
	 * @return
	 */
	public static boolean saveInFTP(String ftpServerIp, String account,
			String password, String filePath, String FileName,
			String uploadFilePath) {
		boolean flag = false;

		// 创建FTP客户端
		FTPClient ftpClient = new FTPClient();
		// 输入流用于读取文件
		FileInputStream fis = null;

		try {
			// 如果FolderName 和 FileName都不符合基本要求, 那么就没有必要进行ftp操作
			if (filePath != null && filePath.compareTo("") != 0
					&& FileName != null && FileName.compareTo("") != 0) {

				// 建立FTP连接
				ftpClient.connect(ftpServerIp);

				// 如果登录成功后, 才进行创建输入流
				if (ftpClient.login(account, password)) {
					File srcClientFile = new File(filePath);
					// 实例化输入流
					fis = new FileInputStream(srcClientFile);

					if (ftpClient.changeWorkingDirectory(uploadFilePath)) {

						// 设置缓冲
						ftpClient.setBufferSize(1024);

						// 设置文件类型(二进制类型)
						if (ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE)) {
							flag = ftpClient.storeFile(FileName, fis);
						}
					}
				}
			}
		} catch (SocketException e) {
			e.printStackTrace();
			flag = false;
		} catch (IOException e) {
			e.printStackTrace();
			flag = false;
		} catch (Exception e) {
			e.printStackTrace();
			flag = false;
		} finally {
			try {
				// 关闭输入流
				IOUtils.closeQuietly(fis);
				// 关闭连接
				ftpClient.disconnect();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		return flag;
	}

	/**
	 * 连接sftp服务器
	 * 
	 * @param host
	 *            主机
	 * @param port
	 *            端口
	 * @param username
	 *            用户名
	 * @param password
	 *            密码
	 * @return
	 */
	public static ChannelSftp connect(String host, int port, String username,
			String password) {
		ChannelSftp sftp = null;
		try {
			JSch jsch = new JSch();
			jsch.getSession(username, host, port);
			Session sshSession = jsch.getSession(username, host, port);
			logger.debug("Session created.");
			sshSession.setPassword(password);
			Properties sshConfig = new Properties();
			sshConfig.put("StrictHostKeyChecking", "no");
			sshSession.setConfig(sshConfig);
			sshSession.connect();
			logger.debug("Session connected.");
			logger.debug("Opening Channel.");
			Channel channel = sshSession.openChannel("sftp");
			channel.connect();
			sftp = (ChannelSftp) channel;
			logger.debug("Connected to " + host + " 成功.");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sftp;
	}

	/**
	 * sftp上传文件
	 * 
	 * @param directory
	 *            上传的目标目录
	 * @param uploadFile
	 *            要上传的文件
	 * @param sftp
	 */
	public static boolean sftpUpload(String host,int port,String username,String password,String directory, String uploadFile) {
		try {
			ChannelSftp sftp = FtpFileUtil.connect(host, port, username, password);
			sftp.cd(directory);
			File file = new File(uploadFile);
			sftp.put(new FileInputStream(file), file.getName());
			logger.debug("上传成功！");
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}finally{
		}
	}


}